home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / data / awkscrpt / dbgz80.awk < prev    next >
Text File  |  1995-02-11  |  7KB  |  336 lines

  1. BEGIN {
  2.     err="/dev/stderr"
  3.     printf("\nZ80デバッグファイル作成ツール") >err
  4.     printf("  DBGZ80\t\tBy Jouji\n\n") >err
  5.     if(tmp=="") tmp="dbgz80.tmp"
  6.     if(dbg=="") dbg="dbgz80.dbg"
  7.     dat="dbgz80.dat"
  8.     em[1]="不正なオペレーションコードが使われている"
  9.     em[2]="文法違反"
  10.     em[3]="未定義シンボルが使われている"
  11.     em[4]="相対ジャンプ先が範囲を越えている"
  12.     em[5]="変位の値が範囲を越えている"
  13.     em[6]="不正なアドレスが指定されている"
  14.     em[7]="シンボルが二重に定義されている"
  15.     print "ニーモニックテーブルにデータをセットしています‥‥" >err
  16.     oc="^(LD|PUSH|POP|EX|EXX|LDI|LDIR|LDD|LDDR|CPI|CPIR|CPD|CPDR|DAA|CPL|NEG|CCF|SCF|NOP|HALT|DI|EI|ADD|ADC|SUB|SBC|AND|OR|XOR|CP|INC|DEC|RLCA|RLA|RRCA|RRA|RLD|RRD|JP|JR|DJNZ|CALL|RET|RETI|RETN|IN|INI|INIR|IND|INDR|OUT|OUTI|OUTIR|OUTD|OUTDR)$"
  17.     r1="^([ABCDEHLIRFZPM]|\\((C|BC|DE|HL|IX|IY|SP)\\)|AF'?|BC|DE|HL|IX|IY|SP|NZ|NC|PO|PE)$"
  18.     r2="^([ABCDEHLIR]|\\((C|BC|DE|HL|IX|IY)\\)|AF'|BC|DE|HL|IX|IY|SP)$"
  19.     r="^([ABCDEHL]|\\(HL\\))$"
  20.     while(getline<dat >0) ob[$1]=$2
  21.     FS=",|[ \t]+"
  22.     h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
  23.     h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
  24.     h["E"]=14;h["F"]=15
  25.     for(i=32;i<256;i++) asc[sprintf("%c",i)]=i
  26.     print "パス1の処理中‥‥" >err
  27. }
  28.  
  29. {    ol[NR]=$0
  30.     sub(/;.*$/,"")
  31.     if($0=="") next
  32.     while($0~/'.+'/) {
  33.         a=index($0,"'")
  34.         s=substr($0,1,a-1)
  35.         t=substr($0,a+1)
  36.         a=index(t,"'")
  37.         u=substr(t,1,a-1)
  38.         t=substr(t,a+1)
  39.         l=length(u)
  40.         v=""
  41.         for(i=1;i<=l;i++) {
  42.             c=substr(u,i,1)
  43.             v=v sprintf("%d,",asc[c])
  44.         }
  45.         sub(/.$/,"",v)
  46.         $0=s v t
  47.     }
  48.     $0=toupper($0)
  49. }
  50. $1!="" {
  51.     sub(/:+$/,"",$1)
  52.     if($1 in st) error(7,NR)
  53.     st[$1]=addr
  54. }
  55. $2=="EQU" {st[$1]=tonum($3);next}
  56. $2=="ORG" {
  57.     a=tonum($3)
  58.     if(a<addr) error(6,NR)
  59.     addr=a
  60.     next
  61. }
  62. $2=="DB" {
  63.     for(i=3;i<=NF && $i!="";i++) {
  64.         if($i~/^[0-9]/)
  65.             printf("%04d D%04X %02X\n",NR,addr,tonum($i)%256) >tmp
  66.         else
  67.             printf("%04d D%04X @1%s\n",NR,addr,$i) >tmp
  68.         addr++
  69.     }
  70.     next
  71. }
  72. $2=="DW" {
  73.     for(i=3;i<=NF && $i!="";i++) {
  74.         if($i~/^[0-9]/) {
  75.             n=tonum($i)
  76.             printf("%04d D%04X %02X\n%04d D%04X %02X\n",
  77.                     NR,addr++,n%256,NR,addr++,int(n/256)) >tmp
  78.         } else {
  79.             printf("%04d D%04X @2%s\n",NR,addr,$i) >tmp
  80.             addr+=2
  81.         }
  82.     }
  83.     next
  84. }
  85. $2=="DS" {
  86.     n=tonum($3)
  87.     for(i=1;i<=n;i++) printf("%04d D%04X 00\n",NR,addr++) >tmp
  88.     next
  89. }
  90. $2=="END" {exit}
  91. $2=="" {next}
  92. {fl=0;op=$2}
  93. op=="IM" {
  94.     printf("%04d I%04X IM   %s\n",NR,addr,$3) >tmp
  95.     addr+=2
  96.     next
  97. }
  98. op=="RST" {
  99.     n=tonum($3)
  100.     if(n<8) n=8*n
  101.     if(n>56 || n%8!=0) error(2,NR)
  102.     printf("%04d I%04X RST  %02X\n",NR,addr,n) >tmp
  103.     addr++
  104.     next
  105. }
  106. op=="LD" {
  107.     if($3~r && $4~r) {
  108.         printf("%04d I%04X LD   %s,%s\n",NR,addr,$3,$4) >tmp
  109.         addr++
  110.         next
  111.     }
  112.     if($3~r && $4~/^\(I[XY].*\)$/) {
  113.         s=ixiy($4)
  114.         printf("%04d I%04X LD   %s,%s%s)\n",NR,addr,$3,substr($4,1,3),s) >tmp
  115.         addr+=3
  116.         next
  117.     }
  118.     if($3~/^\(I[XY].*\)$/) {
  119.         if($4~r) {
  120.             t=$4
  121.             a=addr+3
  122.         } else {
  123.             if($4~/^[0-9]/) {
  124.                 n=tonum($4)
  125.                 t=sprintf("%04X",n%256)
  126.             } else
  127.                 t="@l" $4
  128.             a=addr+4
  129.         }
  130.         s=ixiy($3)
  131.         printf("%04d I%04X LD   %s%s),%s\n",NR,addr,substr($3,1,3),s,t) >tmp
  132.         addr=a
  133.         next
  134.     }
  135. }
  136. op~/^(ADD|ADC|SBC)$/ && $3=="A" {
  137.     if($4~r) {
  138.         printf("%04d I%04X %-5sA,%s\n",NR,addr,op,$4) >tmp
  139.         addr++
  140.         next
  141.     }
  142.     if($4~/^\(I[XY].*\)$/) {
  143.         s=ixiy($4)
  144.         printf("%04d I%04X %-5sA,%s%s)\n",NR,addr,op,substr($4,1,3),s) >tmp
  145.         addr+=3
  146.         next
  147.     }
  148. }
  149. op~/^(SUB|AND|XOR|OR|CP)$/ {
  150.     if($3~r) {
  151.         printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
  152.         addr++
  153.         next
  154.     }
  155.     if($3~/^\(I[XY].*\)$/) {
  156.         s=ixiy($3)
  157.         printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
  158.         addr+=3
  159.         next
  160.     }
  161. }
  162. op~/^(INC|DEC)$/ {
  163.     if($3~r) {
  164.         printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
  165.         addr++
  166.         next
  167.     } else if($3~/^\(I[XY].*\)$/) {
  168.         s=ixiy($3)
  169.         printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
  170.         addr+=3
  171.         next
  172.     }
  173. }
  174. op~/^(RLC|RRC|RL|RR|SLA|SRA|SRL)$/ {
  175.     if($3~r) {
  176.         printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp
  177.         addr+=2
  178.     } else if($3~/^\(I[XY].*\)$/) {
  179.         s=ixiy($3)
  180.         printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp
  181.         addr+=4
  182.     } else error(2,NR)
  183.     next
  184. }
  185. op~/^(BIT|RES|SET)$/ && $3~/^[0-7]$/ {
  186.     if($4~r) {
  187.         printf("%04d I%04X %-5s%s,%s\n",NR,addr,op,$3,$4) >tmp
  188.         addr+=2
  189.     } else if($4~/^\(I[XY].*\)$/) {
  190.         s=ixiy($4)
  191.         printf("%04d I%04X %-5s%s,%s%s)\n",NR,addr,op,$3,substr($4,1,3),s) >tmp
  192.         addr+=4
  193.     } else error(2,NR)
  194.     next
  195. }
  196. op!~oc {error(1,NR)}
  197. $3!="" {
  198.     if($3~r1) {
  199.         op=op $3
  200.         opr1=$3
  201.     } else if($3~/^\(.+\)$/) {
  202.         fl=1
  203.         l=$3
  204.         gsub(/^\(|\)$/,"",l)
  205.         op=op"(?)"
  206.         opr1="(?)"
  207.     } else {
  208.         fl=1
  209.         l=$3
  210.         op=op"?"
  211.         opr1="?"
  212.     }
  213. }
  214. $4!="" {
  215.     if($4~r2) {
  216.         op=op $4
  217.         opr2=$4
  218.     } else if($4~/^\(.+\)$/) {
  219.         fl=1
  220.         l=$4
  221.         gsub(/^\(|\)$/,"",l)
  222.         op=op"(?)"
  223.         opr2="(?)"
  224.     } else {
  225.         fl=1
  226.         l=$4
  227.         op=op"?"
  228.         opr2="?"
  229.     }
  230. }
  231. {    if(!(op in ob)) error(2,NR)
  232.     a=addr+ob[op]
  233.     if($3=="") {
  234.         printf("%04d I%04X %s\n",NR,addr,$2)>tmp
  235.         addr=a
  236.         next
  237.     }
  238.     else if($4=="") opr=sprintf("%s",opr1)
  239.     else opr=sprintf("%s,%s",opr1,opr2)
  240.     if(l~/^[0-9]/) l=sprintf("%04X",tonum(l))
  241.     else l=sprintf("@l%s",l)
  242.     sub(/\?/,l,opr)
  243.     printf("%04d I%04X %-5s%s\n",NR,addr,$2,opr) >tmp
  244.     addr=a
  245. }
  246.  
  247. END {
  248.     print"" >tmp
  249.     for(s in st) printf("%04X %s\n",st[s],s) >tmp
  250.     close(tmp)
  251.     if(errf==1) exit
  252.     printf("パス2の処理中‥‥\n\n") >err
  253.     while(getline<tmp >0 && $0!="") {
  254.         for(i=3;i<=NF;i++) {
  255.             if(!(j=index($i,"@"))) continue
  256.             nr=substr($i,j+1,1)
  257.             l=substr($i,j+2)
  258.             sub(/\)$/,"",l)
  259.             if(!(l in st)) error(3,$1)
  260.             n=st[l]
  261.             addr=tonum("0"substr($2,2)"H")
  262.             if(nr=="l")
  263.                 if($3~/^(JR|DJNZ)$/) {
  264.                     e=n-(addr+2)
  265.                     if(e>127||e<-128) error(4,$1)
  266.                     $i=sprintf("@%04X",n)
  267.                 } else {
  268.                     sub(/@.+$/,sprintf("%04X",n),$i)
  269.                     if(j>1) $i=$i ")"
  270.                 }
  271.             else if(nr~/^[+-]$/) {
  272.                 if(nr=="-") n=-n
  273.                 if(n<-128||n>255) error(5,$1)
  274.                 if(n<0) n+=256
  275.                 d=sprintf("%02X",n)
  276.                 sub(/@.+$/,d")",$i)
  277.             } else {
  278.                 $i=sprintf("%02X",n%256)
  279.                 if(nr=="2") {
  280.                     printf("%s %s %s\n",$1,$2,$3)
  281.                     $2=sprintf("D%04X",++addr)
  282.                     $i=sprintf("%02X",int(n/256))
  283.                 }
  284.             }
  285.         }
  286.         n=$1+0
  287.         if(n==qn) {
  288.             printf("%s %s %s\n",$1,$2,$3)
  289.             continue
  290.         }
  291.         if($4=="") s=sprintf("%s %s %-s",$1,$2,$3)
  292.         else if($5=="") s=sprintf("%s %s %-5s%s",$1,$2,$3,$4)
  293.         else s=sprintf("%s %s %-5s%s,%s",$1,$2,$3,$4,$5)
  294.         i=length(s)
  295.         print s rep(" ",31-i) ";" ol[n]
  296.         qn=n
  297.     }
  298. }
  299.  
  300. function tonum(s,  i,m,n,c) {
  301.     if(s!~/^[0-9]/) return 0
  302.     if(s!~/H$/) return s+0
  303.     m=length(s)
  304.     for(i=1;i<m;i++) {
  305.         c=substr(s,i,1)
  306.         if(c!~/^[0-9A-F]$/) return n
  307.         n=16*n+h[c]
  308.     }
  309.     return n
  310. }
  311.  
  312. function ixiy(s) {
  313.     l=substr(s,4);sub(/.$/,"",l)
  314.     if(l=="") l="+0"
  315.     if(l!~/^[+-]/) error(2,NR)
  316.     pm=substr(l,1,1);sub(/^./,"",l)
  317.     if(l~/^[0-9]/) {
  318.         n=tonum(l)
  319.         if(pm=="-") n=-n
  320.         if(n<-128||n>255) error(5,NR)
  321.         if(n<0) n+=256
  322.         return sprintf("%02X",n)
  323.     } else return ("@" pm l)
  324. }
  325.  
  326. function rep(c,n,  s) {
  327.     while(n-->0) s=s c
  328.     return s
  329. }
  330.  
  331. function error(i,s) {
  332.     print em[i] ": " s " 行" >err
  333.     errf=1
  334.     exit
  335. }
  336.